﻿#ifndef DC_QCUSTOMPLOT_H
#define DC_QCUSTOMPLOT_H

#include "qcustomplot.h"
#include "draw_setting_dialog.h"
#include "assist_cross.h"
#include "mark_layer.h"
#include "setting_plot_rect_dialog.h"
#include "mark_bind_dialog.h"
#include <QUuid>
#include <QtScript>

class CustomPlot;
//修改标题界面
class EditTitleDialog : public QDialog
{
	Q_OBJECT
public:
	explicit EditTitleDialog(QWidget* parent = 0);
	~EditTitleDialog();

	void SetText(const QString& text);
signals:
	void EditFinishedSignal(const QString text);
private:
	void OK();

	QLineEdit* line_edit_;
	QPushButton* btn_ok_;
};


//标题
class CPTextElement : public QCPTextElement
{
public:
	explicit CPTextElement(CustomPlot* parentPlot, const QString& text, const QFont& font);
	~CPTextElement();

protected:
	virtual void mousePressEvent(QMouseEvent* event, const QVariant& details);
};

//数据分析 区域线 状态
enum AnalyzeState
{
	AnalyzeState_NoAction = 0,
	AnalyzeState_StartSelectLine,
	AnalyzeState_SelectStartLine,
	AnalyzeState_SelectEndLine,
	AnalyzeState_SelectBothLine,
	AnalyzeState_StartAnalyze
};

class CustomPlot : public QCustomPlot
{
	Q_OBJECT
public:
	CustomPlot(QWidget* parent);//必须设置父窗口
	~CustomPlot();

	CurveConfig* curve;
	//应用绘图配置
	void ApplyDrawConfig(const PlotSettingConfig& config);
	//预设视图-无值
	void PresettingView(const QString& xName, const QStringList& yNames);
	//添加曲线数据-向已有曲线写入数据
	void AddPlotData(const QString& name, const QVector<double>& xs, const QVector<double>& ys);
	//添加新曲线
	void AddNewPlot(const QString& name, const QVector<double>& xs, const QVector<double>& ys);
	//删除曲线
	void RemovePlot(const QString& name);
	//删除全部曲线
	void RemoveAllPlots();
	//设置范围--联动状态
	void SetRange(QCPRange range);
	//设置辅助线游标
	void SetAssistCrossEnable(bool enable);
	//设置可操纵属性集合 setInteractions
	void SetCurveInteractions(bool enable);
	//设置当前视图在布局中的序号
	void SetPosInLayout(QPoint pos);
	QPoint GetPosInLayout();
	//画面曲线恢复默认显示
	void PlotRecoverDefaultDisplay();
	//设置标题
	void SetTitle(const QString& text);
	void SetCurveConfig(CurveConfig* curve);

	//获取标题
	const QString GetTitle();
	//取消分析
	void CancelAnalyze();
	//设置标签模式使能--单选数据点
	void SetMarkEnable(bool enable);
	//设置放大状态
	void SetLarge(bool isLarge);
	bool IsLarge();

protected:
	void mouseDoubleClickEvent(QMouseEvent* event) override;

private:
	//右键菜单
	void PlotWidgetCustomContextMenu(const QPoint& pos);
	virtual void wheelEvent(QWheelEvent* event) override;
	virtual void enterEvent(QEvent* event) override;
	virtual void leaveEvent(QEvent* event) override;
	/*数据分析-滑动区域线*/
	void mousePressEvent(QMouseEvent* event);
	void mouseReleaseEvent(QMouseEvent* event);
	void mouseMoveEvent(QMouseEvent* event);

	//设置辅助标签位置
	void SetAssstTipPos(int x, int y);
	//设置辅助标签
	void ShowAssistTip();
	//隐藏辅助标签
	void hideAssistTip();
	//显示全区域
	void DisplayAllRect();
	//修改标题
	void EidtTitleText();
	//设置线型
	void SetLineStyleAction();
	//创建标签-自动
	void CreateAutoMarkAction();
	//创建标签-手动
	void CreateManualMarkAction();
	//生成标签
	void GenerateMarkTip(const QString& tip_name, const QStringList& tip_attr, const QString& tip_note = QString());
	//属性脚本执行
	double ExecuteAttrScript(QString script, QPointF p);
	//设置显示区域
	void SetRectAction();
	//启用辅助线
	void SetEnableAssistCrossAction(bool checked);
	//滚轮缩放
	void SetWheelZoomAction(bool checked);
	//框选缩放
	void SetSelectionRectZoomAction(bool checked);
	//选择时间段
	void ChooseTime(bool checked);
	//清除当前视图
	void ClearCurrentViewAction();
	//截图
	void CutPictureAction();

	/*界面拖拽接口*/
	void dragEnterEvent(QDragEnterEvent* event);
	void dragMoveEvent(QDragMoveEvent* event);
	void dropEvent(QDropEvent* event);

	//最小值
	void MinValue();
	//最大值
	void MaxValue();
	//平均值
	void AverageValue();
	//方差
	void Variance();
	double GetVariance(QVector<long double> samples_vector);

	//标准差
	void StandardDeviation();
	double GetStandardDeviation(QVector<long double> samples_vector);
	//选中点事件槽
	void SelectPlottableClick(QCPAbstractPlottable* plottable, int dataIndex, QMouseEvent* event);
	//双击选中点事件槽
	void SelectPlottableDoubleClick(QCPAbstractPlottable* plottable, int dataIndex, QMouseEvent* event);

signals:
	//拖拽交换视图位置信号
	void ViewPosExchangedSignal(QPoint pos1, QPoint pos2);
	//清除当前视图信号
	void ClearCurrentViewSignal(QPoint pos);
	//错误信息
	void SendMessageSignal(const QString& msg);
	//双击事件
	void DoubleClickedSignal();

private:
	bool is_large_;//放大
	AssistCross* assist_cross_;//辅助线
	bool pre_assist_cross_state_;//选择时间段之前的辅助线状态
	int max_point_count_;	//最多点频率
	PlotSettingConfig config_;

	QPoint pos_;//视图对象在自由绘图界面的布局行列坐标
	QRectF plots_rect_;//曲线值范围，用于设置全视图显示

	QMenu* menu_;//菜单
	QAction* edit_title_;//修改标题
	QAction* action_lsNone_;//无连接线
	QAction* action_lsLine_;//直线连接（默认）
	QAction* action_lsStepLeft_;//阶梯线，高度和左边数据点对齐
	QAction* action_lsStepRight_;//阶梯线，高度和右边数据点对齐
	QAction* action_lsImpulse_;//脉冲线
	QAction* action_mark_enable_;//标签模式
	QAction* action_create_manual_mark_;//手动书签
	QAction* action_create_auto_mark_;//快捷书签
	QAction* action_setting_rect_;//设置区域
	QAction* action_recover_rect_;//设置显示区域
	QAction* action_enable_assist_cross_;//启用辅助线
	QAction* action_wheel_zoom_;//滚轮缩放--已弃用
	QAction* action_selection_rect_zoom_;//区域框选
	QAction* choose_time_atcion_;       //选择时间段
	QAction* clear_current_view_action_;//清除当前视图
	QAction* action_cut_picture;//截图

	QAction* action_max_value_;//最大值
	QAction* action_min_value_;//最小值
	QAction* action_average_value_;//平均值
	QAction* action_std_dev_;//标准差

	CPTextElement* title_;		//标题
	QCPItemStraightLine* select_start_line_;//每次选中的图像的起始竖线
	QCPItemStraightLine* select_end_line_;//结束竖线
	AnalyzeState analyze_state_;//是否分析状态

	MarkLayer* mark_layer_;//标签图层
	QCPGraph* mark_current_graph_;//标签模式下选中的线
	QPointF mark_current_point_;//标签模式下选中的点

};

#endif // DC_QCUSTOMPLOT_H
